
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.StringTokenizer;
import java.util.regex.Pattern;
public class FileUtil {
	private String message;
	public FileUtil() {
	}

	/**
	 * 读取文本文件内容
	 * @param filePathAndName 带有完整绝对路径的文件名
	 * @param encoding 文本文件打开的编码方式
	 * @return 返回文本文件的内容
	 */
	public static String readTxt(String filePathAndName,String encoding) throws IOException{
		encoding = encoding.trim();
		StringBuffer str = new StringBuffer("");
		String st = "";
		try{
			FileInputStream fs = new FileInputStream(filePathAndName);
			InputStreamReader isr;
			if(encoding.equals("")){
				isr = new InputStreamReader(fs);
			}else{
				isr = new InputStreamReader(fs,encoding);
			}
			BufferedReader br = new BufferedReader(isr);
			try{
				String data = "";
				while((data = br.readLine())!=null){
					str.append(data+" ");
				}
			}catch(Exception e){
				str.append(e.toString());
			}
			st = str.toString();
		}catch(IOException es){
			st = "";
		}
		return st;     
	}

	/**
	 * 读取文本文件内容
	 * @param filePathAndName 带有完整绝对路径的文件名
	 * @param encoding 文本文件打开的编码方式
	 * @return 返回文本文件的内容
	 */
	public static String readTxt(File file,String encoding) throws IOException{
		encoding = encoding.trim();
		StringBuffer str = new StringBuffer("");
		String st = "";
		try{
			FileInputStream fs = new FileInputStream(file);
			InputStreamReader isr;
			if(encoding.equals("")){
				isr = new InputStreamReader(fs);
			}else{
				isr = new InputStreamReader(fs,encoding);
			}
			BufferedReader br = new BufferedReader(isr);
			try{
				String data = "";
				while((data = br.readLine())!=null){
					str.append(data+"\r\n");
				}
			}catch(Exception e){
				str.append(e.toString());
			}
			st = str.toString();
		}catch(IOException es){
			st = "";
		}
		return st;     
	}

	/**
	 * 读取文本文件内容
	 * @param filePathAndName 带有完整绝对路径的文件名
	 * @param encoding 文本文件打开的编码方式
	 * @param collection 收集器，文本内容会被逐行添加到里面
	 * @return void
	 */
	public static void readTxt(String filePathAndName,String encoding , List<String> collection) throws IOException{
		if(collection == null)
			return;
		
		if(encoding == null || "".equals(encoding.trim()))
			encoding = "UTF-8";
		
		try{
			FileInputStream fs = new FileInputStream(filePathAndName);
			InputStreamReader isr;
			
			isr = new InputStreamReader(fs,encoding);
			
			BufferedReader br = new BufferedReader(isr);
			try{
				String data = null;
				while((data = br.readLine())!=null){
					collection.add(data);
				}
			}catch(Exception e){
				e.printStackTrace();
				//str.append(e.toString());
			}
			
		}catch(IOException es){
			
		}

	}

	/**
	 * 新建目录
	 * @param folderPath 目录
	 * @return 返回目录创建后的路径
	 */
	public String createFolder(String folderPath) {
		String txt = folderPath;
		try {
			java.io.File myFilePath = new java.io.File(txt);
			txt = folderPath;
			if (!myFilePath.exists()) {
				myFilePath.mkdir();
			}
		}
		catch (Exception e) {
			message = "创建目录操作出错";
		}
		return txt;
	}

	/**
	 * 多级目录创建
	 * @param folderPath 准备要在本级目录下创建新目录的目录路径 例如 c:myf
	 * @param paths 无限级目录参数，各级目录以单数线区分 例如 a|b|c
	 * @return 返回创建文件后的路径 例如 c:myfac
	 */
	public String createFolders(String folderPath, String paths){
		String txts = folderPath;
		try{
			String txt;
			txts = folderPath;
			StringTokenizer st = new StringTokenizer(paths,"|");
			for(int i=0; st.hasMoreTokens(); i++){
				txt = st.nextToken().trim();
				if(txts.lastIndexOf("/")!=-1){
					txts = createFolder(txts+txt);
				}else{
					txts = createFolder(txts+txt+"/");   
				}
			}
		}catch(Exception e){
			message = "创建目录操作出错！";
		}
		return txts;
	}


	/**
	 * 新建文件
	 * @param filePathAndName 文本文件完整绝对路径及文件名
	 * @param fileContent 文本文件内容
	 * @return
	 */
	public void createFile(String filePathAndName, String fileContent) {

		try {
			String filePath = filePathAndName;
			filePath = filePath.toString();
			File myFilePath = new File(filePath);
			if (!myFilePath.exists()) {
				myFilePath.createNewFile();
			}
			FileWriter resultFile = new FileWriter(myFilePath);
			PrintWriter myFile = new PrintWriter(resultFile);
			String strContent = fileContent;
			myFile.println(strContent);
			myFile.close();
			resultFile.close();
		}
		catch (Exception e) {
			message = "创建文件操作出错";
		}
	}


	/**
	 * 有编码方式的文件创建
	 * @param filePathAndName 文本文件完整绝对路径及文件名
	 * @param fileContent 文本文件内容
	 * @param encoding 编码方式 例如 GBK 或者 UTF-8
	 * @return
	 */
	public void createFile(String filePathAndName, String fileContent, String encoding) {

		try {
			String filePath = filePathAndName;
			filePath = filePath.toString();
			File myFilePath = new File(filePath);
			if (!myFilePath.exists()) {
				myFilePath.createNewFile();
			}
			PrintWriter myFile = new PrintWriter(myFilePath,encoding);
			String strContent = fileContent;
			myFile.println(strContent);
			myFile.close();
		}
		catch (Exception e) {
			message = "创建文件操作出错";
		}
	}


	/**
	 * 删除文件
	 * @param filePathAndName 文本文件完整绝对路径及文件名
	 * @return Boolean 成功删除返回true遭遇异常返回false
	 */
	public boolean delFile(String filePathAndName) {
		boolean bea = false;
		try {
			String filePath = filePathAndName;
			File myDelFile = new File(filePath);
			if(myDelFile.exists()){
				myDelFile.delete();
				bea = true;
			}else{
				bea = false;
				message = (filePathAndName+"删除文件操作出错");
			}
		}
		catch (Exception e) {
			message = e.toString();
		}
		return bea;
	}



	/**
	 * 删除文件夹
	 * @param folderPath 文件夹完整绝对路径
	 * @return
	 */
	public void delFolder(String folderPath) {
		try {
			delAllFile(folderPath); //删除完里面所有内容
			String filePath = folderPath;
			filePath = filePath.toString();
			java.io.File myFilePath = new java.io.File(filePath);
			myFilePath.delete(); //删除空文件夹
		}
		catch (Exception e) {
			message = ("删除文件夹操作出错");
		}
	}


	/**
	 * 删除指定文件夹下所有文件
	 * @param path 文件夹完整绝对路径
	 * @return
	 * @return
	 */
	public boolean delAllFile(String path) {
		boolean bea = false;
		File file = new File(path);
		if (!file.exists()) {
			return bea;
		}
		if (!file.isDirectory()) {
			return bea;
		}
		String[] tempList = file.list();
		File temp = null;
		for (int i = 0; i < tempList.length; i++) {
			if (path.endsWith(File.separator)) {
				temp = new File(path + tempList[i]);
			}else{
				temp = new File(path + File.separator + tempList[i]);
			}
			if (temp.isFile()) {
				temp.delete();
			}
			if (temp.isDirectory()) {
				delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
				delFolder(path+"/"+ tempList[i]);//再删除空文件夹
				bea = true;
			}
		}
		return bea;
	}


	/**
	 * 复制单个文件
	 * @param oldPathFile 准备复制的文件源
	 * @param newPathFile 拷贝到新绝对路径带文件名
	 * @return
	 */
	public void copyFile(String oldPathFile, String newPathFile) {
		try {
			int bytesum = 0;
			int byteread = 0;
			File oldfile = new File(oldPathFile);
			if (oldfile.exists()) { //文件存在时
				InputStream inStream = new FileInputStream(oldPathFile); //读入原文件
				FileOutputStream fs = new FileOutputStream(newPathFile);
				byte[] buffer = new byte[1444];
				while((byteread = inStream.read(buffer)) != -1){
					bytesum += byteread; //字节数 文件大小
					System.out.println(bytesum);
					fs.write(buffer, 0, byteread);
				}
				inStream.close();
			}
		}catch (Exception e) {
			message = ("复制单个文件操作出错");
		}
	}


	/**
	 * 复制整个文件夹的内容
	 * @param oldPath 准备拷贝的目录
	 * @param newPath 指定绝对路径的新目录
	 * @return
	 */
	public void copyFolder(String oldPath, String newPath) {
		try {
			new File(newPath).mkdirs(); //如果文件夹不存在 则建立新文件夹
			File a=new File(oldPath);
			String[] file=a.list();
			File temp=null;
			for (int i = 0; i < file.length; i++) {
				if(oldPath.endsWith(File.separator)){
					temp=new File(oldPath+file[i]);
				}else{
					temp=new File(oldPath+File.separator+file[i]);
				}
				if(temp.isFile()){
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(newPath + "/" +
							(temp.getName()).toString());
					byte[] b = new byte[1024 * 5];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				}
				if(temp.isDirectory()){//如果是子文件夹
					copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);
				}
			}
		}catch (Exception e) {
			message = "复制整个文件夹内容操作出错";
		}
	}


	/**
	 * 移动文件
	 * @param oldPath
	 * @param newPath
	 * @return
	 */
	public void moveFile(String oldPath, String newPath) {
		copyFile(oldPath, newPath);
		delFile(oldPath);
	}


	/**
	 * 移动目录
	 * @param oldPath
	 * @param newPath
	 * @return
	 */
	public void moveFolder(String oldPath, String newPath) {
		copyFolder(oldPath, newPath);
		delFolder(oldPath);
	}
	public String getMessage(){
		return this.message;
	}
	/**
	 * 
	 * 保存文件
	 * */
	public static void saveFile(String content , String path , String encode){
		
		if(path == null)
			return;
		File newFile = new File(path);
		if(!newFile.getParentFile().exists())
    		newFile.getParentFile().mkdirs();
    	if (!newFile.exists()) {
    		try {
				newFile.createNewFile();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
    	
    	//newFile.createNewFile();
    	OutputStream outputStream;
		OutputStreamWriter outputStreamWriter;
		try {
			outputStream = new FileOutputStream(newFile);
			outputStreamWriter = new OutputStreamWriter(outputStream , encode);

			outputStreamWriter.write(content);
			
			//关闭输出
			outputStreamWriter.close();
			outputStream.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		outputStream = null;
		outputStreamWriter = null;
	}
	/**
	 * 复制整个文件夹的内容
	 * @param oldPath 准备拷贝的目录
	 * @param newPath 指定绝对路径的新目录
	 * @return
	 */
	public static void replaceFiles(String oldPath, String newPath , String charSet ,  String filter[] , String replaceFrom , String replaceTo , List collection) {
		try {
			//new File(newPath).mkdirs(); //如果文件夹不存在 则建立新文件夹
			File a=new File(oldPath);
			String[] file=a.list();
			File temp=null;
			for (int i = 0; i < file.length; i++) {
				
				try {
					if(oldPath.endsWith(File.separator)){
						temp=new File(oldPath+file[i]);
					}else{
						temp=new File(oldPath+File.separator+file[i]);
					}
					if(temp.isFile()){
						
						boolean filterFlag = false;
						if(filter != null && filter.length > 0)
						{
								for(int j = 0 ; j < filter.length ; j++)
								{
									//System.out.println(temp.getName());
									if(temp.getName().endsWith("."+filter[j]))
										filterFlag = true;
									
								}
						}
						if(!filterFlag)
							continue;
						//System.out.println("处理："+temp.getAbsolutePath());
						//如果文件不存在
						
						//------------------读取文件开始---------------------------------
						
						String s = null;
						s=readTxt(temp, charSet);
						/*StringBuffer sBuffer = new StringBuffer();
						
						InputStream fileReader = new FileInputStream(temp);
						InputStreamReader inputStreamReader = new InputStreamReader(fileReader , charSet);
						BufferedReader input = new BufferedReader(inputStreamReader);
						
					    while ((s = input.readLine()) != null) {
					    	   sBuffer.append(s + "\r\n") ;
					    }
					    //关闭输入
					    fileReader.close();
					    inputStreamReader.close();
					    input.close();
					    
					    
					    fileReader = null;
					    inputStreamReader = null;
					    input =null;
						 s = sBuffer.toString();*/
					  //------------------读取文件结束---------------------------------
					    
					    
					   
					    //System.out.println(s);
					 //---------------------------保存文件开始-------------------------------------------------------
					    if(s != null && Pattern.compile(replaceFrom).matcher(s).find())
					    {
					    	//System.out.println("替换："+temp.getAbsolutePath());
					    	
					    	saveFile(s.replaceAll(replaceFrom, replaceTo), 
					    			newPath + "/" +(temp.getName()).toString(), 
					    			charSet);
					    	/*File newFile = new File(newPath + "/" +(temp.getName()).toString());
					    	if(!newFile.getParentFile().exists())
					    		newFile.getParentFile().mkdirs();
					    	if (!newFile.exists()) {
					    		newFile.createNewFile();
							}
					    	
					    	//newFile.createNewFile();
					    	OutputStream outputStream = new FileOutputStream(newFile);
					    	OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream , charSet);

							outputStreamWriter.write(s);
							
							//关闭输出
							outputStreamWriter.close();
							outputStream.close();
							
							outputStream = null;
							outputStreamWriter = null;*/
							collection.add(newPath + "/" +(temp.getName()).toString());	
					    }	
					  //---------------------------保存文件结束-------------------------------------------------------
					}
					else if(temp.isDirectory()){//如果是子文件夹
						replaceFiles(oldPath+"/"+file[i],newPath+"/"+file[i] , charSet ,filter , replaceFrom , replaceTo ,collection);
					}
				} catch (RuntimeException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					//System.out.println();
				}
			}
		}catch (Exception e) {
			e.printStackTrace();
			System.out.println("复制整个文件夹内容操作出错"+newPath) ;
		}
	}
}